// // 假设二叉树采用二叉链存储结构存储，设计一个算法求其中最小值的节点值。
//  #include <stdio.h>
//  #include <stdlib.h>
//  #include <stdbool.h>
//  #include "windows.h"
//
//  //自定义类型
//  typedef int ElemData;
//
//  //自定义树节点
//  typedef struct TreeNode {
//      ElemData data;
//      struct TreeNode* left;
//      struct TreeNode* right;
//  }TreeNode;
//
// //队列节点
// typedef struct QueueNode {
//     TreeNode* data;
//     struct QueueNode* next;
// }QueueNode;
//
// //队列结构
// typedef struct Queue {
//      QueueNode* front;
//      QueueNode* rear;
// }Queue;
//
//  //创建树节点
//  TreeNode* CreateTreeNode(ElemData x) {
//      TreeNode* newNode=(TreeNode*)malloc(sizeof(TreeNode));
//      if(newNode==NULL) {
//          exit(1);
//      }
//      newNode->data=x;
//      newNode->left=newNode->right=NULL;
//      return newNode;
//  }
//
//  //插入树节点(二叉搜索树规则:注意)
//  TreeNode* InsertTreeNode(TreeNode* root,ElemData x) {
//      if(root==NULL) {
//          return CreateTreeNode(x);
//      }
//      if(x<root->data) {
//          root->left=InsertTreeNode(root->left,x);
//      }else {
//          root->right=InsertTreeNode(root->right,x);
//      }
//      return root;
//  }
//
// //入队操作(层次遍历)
// void enqueue(Queue* q, TreeNode* node) {
//     QueueNode* newNode=(QueueNode*)malloc(sizeof(QueueNode));
//     if(newNode==NULL) {
//         printf("申请失败\n");
//         exit(1);
//     }
//     newNode->data=node;
//     newNode->next=NULL;
//     if(q->rear==NULL) {
//         q->front=q->rear=newNode;
//     }
//     q->rear->next=newNode;
//     q->rear=newNode;
// }
//
// //出队操作(层次遍历)
// TreeNode* dequeue(Queue* q) {
//     if(q->front==NULL) {
//         return NULL;
//     }
//     QueueNode* tmp=q->front;
//     TreeNode* node=tmp->data;
//     q->front=q->front->next;
//     if(q->front==NULL) {
//         q->rear=NULL;
//     }
//     free(tmp);
//     return node;
// }
// //第一种方法(基于层次遍历)
// ElemData Compute1(TreeNode* root) {
//      Queue q;
//      q.front=q.rear=NULL;
//      if(root==NULL) {
//          return 0;
//      }
//     ElemData min=root->data;
//     enqueue(&q,root);
//     while (q.front) {
//         TreeNode* node=dequeue(&q);
//         if(min>node->data) {
//             min=node->data;
//         }
//         if(node->left) {
//             enqueue(&q,node->left);
//         }
//         if(node->right) {
//             enqueue(&q,node->right);
//         }
//     }
//      return min;
//  }
//
// // exit(1); 是用来终止整个程序的执行。
// // 它会立即结束程序，并返回一个状态码给操作系统。状态码 1 通常表示程序因错误而终止。
// // exit(1); 不会返回到调用它的函数，而是直接结束程序
//
// //第二种方法
// void FindMinNode(TreeNode* root,ElemData* min) {
//      if(root==NULL) {
//          // printf("树为空\n");
//          return;
//      }
//      if(*min>root->data) {
//          *min=root->data;
//      }
//      FindMinNode(root->left,min);
//      FindMinNode(root->right,min);
//  }
//
// void Compute2(TreeNode* root) {
//      if(root==NULL) {
//          // printf("树为空\n");
//          return;
//      }
//      ElemData min=root->data;
//      FindMinNode(root,&min);
//      printf("%d ",min);
//  }
//
//  int main() {
//      SetConsoleOutputCP(CP_UTF8);
//      TreeNode* root = NULL;
//      int values[] = {50, 30, 70, 20, 40, 60, 80};
//      int n = sizeof(values) / sizeof(values[0]);
//      for(int i=0;i<n;i++) {
//          root=InsertTreeNode(root,values[i]);
//      }
//      printf("最小元素:%d",Compute1(root));printf("\n");
//      printf("最小元素:");Compute2(root);printf("\n");
//      free(root);
//      root=NULL;
//      return 0;
//  }